import numpy as np

# =============== 场景1：矩阵与向量运算 ===============
print("场景1：矩阵与向量运算")
# 创建一个3x4矩阵
matrix = np.array([[1, 2, 3, 4],
                   [5, 6, 7, 8],
                   [9, 10, 11, 12]])

# 创建一个行向量 (1D数组)
row_vector = np.array([10, 20, 30, 40])

# 创建一个列向量 (2D数组，形状为3x1)
col_vector = np.array([[100],
                       [200],
                       [300]])

# 广播：矩阵 + 行向量 (行向量被广播到每行)
result1 = matrix + row_vector
print("\n1. 矩阵 + 行向量:")
print(result1)

# 广播：矩阵 + 列向量 (列向量被广播到每列)
result2 = matrix + col_vector
print("\n2. 矩阵 + 列向量:")
print(result2)

# 广播：三重操作 (行向量和列向量同时广播)
result3 = matrix * 2 + row_vector - col_vector
print("\n3. 复合广播运算 (matrix*2 + row_vector - col_vector):")
print(result3)

# =============== 场景2：不同维度数组运算 ===============
print("\n场景2：不同维度数组运算")
# 创建3D张量 (2x3x4)
tensor_3d = np.arange(24).reshape(2, 3, 4)

# 创建2D矩阵 (3x4)
matrix_2d = np.array([[1, 0, -1, 0],
                      [0, 2, 0, -2],
                      [-1, 0, 1, 0]])

# 创建1D向量 (4,)
vector_1d = np.array([10, 20, 30, 40])

# 广播：3D张量 + 2D矩阵 (矩阵被广播到每个深度切片)
result4 = tensor_3d + matrix_2d
print("\n4. 3D张量 + 2D矩阵:")
print(result4)

# 广播：3D张量 * 1D向量 (向量被广播到每个行和深度)
result5 = tensor_3d * vector_1d
print("\n5. 3D张量 * 1D向量:")
print(result5)

# =============== 场景3：实际应用示例 ===============
print("\n场景3：实际应用示例")

# 示例1：标准化数据 (减去均值，除以标准差)
print("\n6. 数据标准化:")
data = np.random.rand(5, 3) * 100  # 5个样本，3个特征
mean = data.mean(axis=0)           # 计算每个特征的均值
std = data.std(axis=0)             # 计算每个特征的标准差
normalized = (data - mean) / std   # 广播：每列减去对应均值，除以对应标准差

print("原始数据:\n", np.round(data, 2))
print("特征均值:", np.round(mean, 2))
print("特征标准差:", np.round(std, 2))
print("标准化后:\n", np.round(normalized, 2))

# 示例2：计算欧氏距离矩阵
print("\n7. 欧氏距离矩阵:")
points = np.array([[1, 2], [3, 4], [5, 6]])  # 3个2D点

# 利用广播计算所有点对的距离
diff = points[:, np.newaxis, :] - points[np.newaxis, :, :]  # 形状变为(3,3,2)
distances = np.sqrt(np.sum(diff**2, axis=-1))  # 计算欧氏距离

print("点坐标:\n", points)
print("距离矩阵:\n", np.round(distances, 2))

# 示例3：图像处理滤波器
print("\n8. 图像滤波器应用:")
# 创建一个8x8的灰度图像 (0-255)
image = np.random.randint(0, 256, (8, 8))

# 创建3x3高斯滤波器
gaussian_filter = np.array([[1, 2, 1],
                           [2, 4, 2],
                           [1, 2, 1]]) / 16.0

# 初始化输出图像
filtered_image = np.zeros_like(image, dtype=float)

# 使用广播应用滤波器 (实际中会使用更高效的方法，这里演示广播)
for i in range(1, 7):
    for j in range(1, 7):
        # 提取3x3图像块
        patch = image[i-1:i+2, j-1:j+2]
        # 应用滤波器 (广播：滤波器自动扩展到每个位置)
        filtered_image[i, j] = np.sum(patch * gaussian_filter)

print("原始图像:\n", image)
print("滤波后图像 (四舍五入):\n", np.round(filtered_image).astype(int))